package ThreadingSafety;

/**
 *  单例模式: 是一种常见的设计模式.
 *      单例模式指的是 某个类只有 一个 实例对象.这是根据需求决定的, 比如一个男人只能有一个老婆~~
 *      单例模式本质上是借助 编程语言 自身的语法特性, 强行限制某个类不能创建对各实例.
 *      那么在Java中,有哪些东西是天然单例的呢?? [匿名内部类, 枚举, static...]
 *      在此介绍的是 static!! static修饰的成员/属性 变成了 类成员/类属性, 此时就已经是"单例".
 *
 *      在此介绍的是"饿汉模式" 的单例模式, 饿汉模式是线程安全的.
 *      对应的就有"懒汉模式", 在TestDemo19中讲解...
 */

class Singleton {
    // 创建 Singleton 这个类的唯一实例.[用static修饰]
    private static Singleton instance = new Singleton();

    // 所谓单例就是只有一个实例,那么就不能在类的外部再创建新的实例了,
    // 所以为了"单例"的初衷,不能在类外创建新的实例,将构造方法设为私有的!
    private Singleton() {

    }
    // 类的外部不能创建实例,那么就需要给一个接口,让类外可以获取到这个"单例"实例
    public static Singleton getInstance() {
        return instance; // 在"饿汉模式"中,即使多个线程同时调用 getInstance 方法,
                         // 但是在此处只涉及到了"读", 并没有"改"操作,因此线程安全.
    }
}

public class TestDemo18 {
    public static void main(String[] args) {
        // 外类不能创建新的实例 只能通过getInstance 获取到唯一实例
        Singleton singleton = Singleton.getInstance();
    }
}

// 以上代码就是"饿汉模式"的单例模式了.